From 0905c73a886d665d0c046b75ab78ef923708ea31 Mon Sep 17 00:00:00 2001 From: Tor Lillqvist Date: Thu, 8 Sep 2005 22:45:40 +0000 Subject: [PATCH] Cache the display name. There is only one GdkDisplay on Win32, and 2005-09-09 Tor Lillqvist * gdk/win32/gdkdisplay-win32.c (gdk_display_get_name): Cache the display name. There is only one GdkDisplay on Win32, and constructing the display name isn't entirely trivial, so cacheing is probably worth it. For instance GIMP calls this function a lot. (gdk_display_open): Call gdk_display_get_name() to prime the cached name. (gdk_display_get_n_screens, gdk_display_get_screen, gdk_display_get_default_screen): Verify parameter correctness like the X11 backend does. * gdk/win32/gdkscreen-win32.c (gdk_screen_make_display_name): Return a freshly allocated string, as the API specifies. Fixes a heap corruption problem that caused random errors and crashes in GIMP, for instance. --- ChangeLog | 17 +++++++++++++++++ ChangeLog.pre-2-10 | 17 +++++++++++++++++ gdk/win32/gdkdisplay-win32.c | 28 ++++++++++++++++++++-------- gdk/win32/gdkscreen-win32.c | 2 +- 4 files changed, 55 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5f5d55d348..4676c76c8f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2005-09-09 Tor Lillqvist + + * gdk/win32/gdkdisplay-win32.c (gdk_display_get_name): Cache the + display name. There is only one GdkDisplay on Win32, and + constructing the display name isn't entirely trivial, so cacheing + is probably worth it. For instance GIMP calls this function a lot. + (gdk_display_open): Call gdk_display_get_name() to prime the + cached name. + (gdk_display_get_n_screens, gdk_display_get_screen, + gdk_display_get_default_screen): Verify parameter correctness like + the X11 backend does. + + * gdk/win32/gdkscreen-win32.c (gdk_screen_make_display_name): + Return a freshly allocated string, as the API specifies. Fixes a + heap corruption problem that caused random errors and crashes in + GIMP, for instance. + 2005-09-07 Matthias Clasen * gtk/gtkimcontextsimple.c (gtk_im_context_simple_filter_keypress): diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 5f5d55d348..4676c76c8f 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,20 @@ +2005-09-09 Tor Lillqvist + + * gdk/win32/gdkdisplay-win32.c (gdk_display_get_name): Cache the + display name. There is only one GdkDisplay on Win32, and + constructing the display name isn't entirely trivial, so cacheing + is probably worth it. For instance GIMP calls this function a lot. + (gdk_display_open): Call gdk_display_get_name() to prime the + cached name. + (gdk_display_get_n_screens, gdk_display_get_screen, + gdk_display_get_default_screen): Verify parameter correctness like + the X11 backend does. + + * gdk/win32/gdkscreen-win32.c (gdk_screen_make_display_name): + Return a freshly allocated string, as the API specifies. Fixes a + heap corruption problem that caused random errors and crashes in + GIMP, for instance. + 2005-09-07 Matthias Clasen * gtk/gtkimcontextsimple.c (gtk_im_context_simple_filter_keypress): diff --git a/gdk/win32/gdkdisplay-win32.c b/gdk/win32/gdkdisplay-win32.c index fe08e45841..4998948573 100644 --- a/gdk/win32/gdkdisplay-win32.c +++ b/gdk/win32/gdkdisplay-win32.c @@ -236,6 +236,9 @@ gdk_display_open (const gchar *display_name) _gdk_input_init (_gdk_display); _gdk_dnd_init (); + /* Precalculate display name */ + (void) gdk_display_get_name (_gdk_display); + g_signal_emit_by_name (gdk_display_manager_get (), "display_opened", _gdk_display); @@ -253,9 +256,13 @@ gdk_display_get_name (GdkDisplay *display) HWINSTA hwinsta = GetProcessWindowStation (); char *window_station_name; DWORD n; - DWORD session_id; char *display_name; - const char *retval; + static const char *display_name_cache = NULL; + + g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); + + if (display_name_cache != NULL) + return display_name_cache; n = 0; GetUserObjectInformation (hdesk, UOI_NAME, &dummy, 0, &n); @@ -285,22 +292,22 @@ gdk_display_get_name (GdkDisplay *display) window_station_name = "WinSta0"; } - display_name = g_strdup_printf ("%ld\\%s\\%s", + display_name = g_strdup_printf ("%d\\%s\\%s", get_session_id (), window_station_name, desktop_name); - retval = g_quark_to_string (g_quark_from_string (display_name)); - - g_free (display_name); + GDK_NOTE (MISC, g_print ("gdk_display_get_name: %s\n", display_name)); - GDK_NOTE (MISC, g_print ("gdk_display_get_name: %s\n", retval)); + display_name_cache = display_name; - return retval; + return display_name_cache; } gint gdk_display_get_n_screens (GdkDisplay *display) { + g_return_val_if_fail (GDK_IS_DISPLAY (display), 0); + return 1; } @@ -308,12 +315,17 @@ GdkScreen * gdk_display_get_screen (GdkDisplay *display, gint screen_num) { + g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); + g_return_val_if_fail (screen_num != 0, NULL); + return _gdk_screen; } GdkScreen * gdk_display_get_default_screen (GdkDisplay *display) { + g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); + return _gdk_screen; } diff --git a/gdk/win32/gdkscreen-win32.c b/gdk/win32/gdkscreen-win32.c index 91e3ff6a2f..59b5430cdd 100644 --- a/gdk/win32/gdkscreen-win32.c +++ b/gdk/win32/gdkscreen-win32.c @@ -115,5 +115,5 @@ _gdk_windowing_substitute_screen_number (const gchar *display_name, gchar * gdk_screen_make_display_name (GdkScreen *screen) { - return gdk_display_get_name (_gdk_display); + return g_strdup (gdk_display_get_name (_gdk_display)); } -- 2.30.2